package main

import (
	"fmt"
	"github.com/kataras/iris"

	"github.com/kataras/iris/middleware/logger"
	"github.com/kataras/iris/middleware/recover"
)

func main() {
	//参考网站:http://www.hrefs.cn/article/go-web-with-iris-examples , 分享万岁!
	app := iris.New() // iris.Default()是啥
	app.Logger().SetLevel("debug")
	// 可以选择添加两个内置的处理程序可以从任何http相关的错误中恢复,并将请求记录到终端.
	app.Use(recover.New())
	app.Use(logger.New())

	// 用上下文对象Context返回数据时可以设置多种返回类型,比如ctx.HTML ctx.JSON ctx.JSONP ctx.TEXT ctx.WriteString等
	// app.Handle, app.Get, app.Post, app.Put, app.Delete

	// 捕获以 GET (或者 POST 方式) 的默认请求, 这里的iris.Context就是上下文信息,我暂且理解为java的request.
	app.Handle("GET", "/", func(ctx iris.Context) {
		intFromDefaultUrl, errFromDefaultUrl := ctx.HTML("<h1>用Handle处理的get请求测试</h1>")
		//这里的打印仅仅只是为了防止编译错误,后续可以将错误信息返回给前端或者记录日志.
		fmt.Printf("错误,当前错误信息为: %v %v", intFromDefaultUrl, errFromDefaultUrl)
	})

	// 捕获以 GET 方式 的ping请求, 这个写法和app.Handle方法一个意思.
	app.Get("/get", func(ctx iris.Context) {
		intFromPingUrl, errFromPingUrl := ctx.WriteString("get请求测试")
		fmt.Printf("错误,当前错误信息为: %v %v", intFromPingUrl, errFromPingUrl)
	})

	// 捕获以 POST 方式 的ping请求. 如果想模拟,我想可以写一个表单,设置为post请求方式...
	app.Post("/post", func(ctx iris.Context) {
		intFromPingUrl, errFromPingUrl := ctx.WriteString("post请求测试")
		fmt.Printf("错误,当前错误信息为: %v %v", intFromPingUrl, errFromPingUrl)
	})

	// 获取前端传递的参数, 比如动态url参数, url后面跟的参数以及表单的参数.
	app.Get("/parameters/{urlparam}", func(ctx iris.Context) {
		urlparam := ctx.Params().Get("urlparam") // 动态url参数
		id := ctx.URLParam("id")                 // url ?后面参数,强制包含
		page := ctx.URLParamDefault("page", "0") // url参数,非强制,若空则为0
		name := ctx.FormValue("name")            // 表单参数
		app.Logger().Infof("id: %s; page: %s; name: %s; message: %s", id, page, name)
		fmt.Printf("从请求中获取的参数为: %v %v %v %v", urlparam, id, page, name)
	})

	// 限制url参数类型, 长度, 格式等, 大家举一反三,自行脑补
	app.Get("/users/{id:uint64 max(255)}", func(ctx iris.Context) {
		id := ctx.Params().GetUint64Default("id", 0)
		ctx.Writef("User with ID: %d", id)
	})

	// 用于收集错误信息.如果遇到`http/iris#ErrServerClosed`错误, 那么err的值是 nil .
	err := app.Run(iris.Addr(":8080"), iris.WithoutServerError(iris.ErrServerClosed))
	fmt.Printf("服务器错误,当前错误信息为: %v", err)
}
